package com.nd.rj.common.login.interfaceImpl;

import org.json.JSONObject;

import android.app.Dialog;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.common.android.utils.task.progressTask.ProgressTask;
import com.common.utils.EncryptTool;
import com.nd.rj.common.ILogin99Listener;
import com.nd.rj.common.R;
import com.nd.rj.common.incrementalupdates.utils.LogUtil;
import com.nd.rj.common.login.NdLogin99Assistant;
import com.nd.rj.common.login.NdLoginComFun;
import com.nd.rj.common.login.NdMiscCallbackListener;
import com.nd.rj.common.login.DataDef.NdLoginConst;
import com.nd.rj.common.login.communication.uapCom;
import com.nd.rj.common.login.entity.AccountStatus;
import com.nd.rj.common.login.entity.IAccountStatus;
import com.nd.rj.common.login.loginInterface.INdLogin99PlatformOperate;
import com.nd.rj.common.login.task.LoginMsgLoginTask;
import com.nd.rj.common.login.task.LoginNormalLoginTask;
import com.nd.rj.common.login.task.LoginSendMsgCodeTask;
import com.nd.rj.common.util.ComfunHelp;
import com.product.android.business.bean.UserInfo;

/**
 * ClassName:NdLogin99PlatformImpl Function: 登录到91帐号中心相关流程 Reason:
 * 在V1.1之后要采用更加严谨的登录方式以防止恶意攻击，原来的json串形式登录到UAP要改成字节流的形式先登录到
 * 91帐号中心，获取到cookie之后再用这个cookie再登录到UAP或者OAP。 Attention: 1、此类用于应用自已创建登录的界面而不使用共通登录模块里的登录界面
 * 2、在自定义的登录界面的onCreate方法务必要先获取此方法的一个单体实例，以便初始化登录环境
 * 3、必须在自定义的界面里实现NdMiscCallbackListener.IGetCheckcodeListener接口回调，用于 　
 * 显示验证码。因为在此登录模式下，密码错误若干次（现在是4次）后必须输入验证码才能登录 4、具体调用方式可参考NdLogin.java类
 * 
 * @author cb
 * @version
 * @since Ver 1.1
 * @Date 2013 2013-5-27 下午3:27:49
 * 
 * @see
 */
public class NdLogin99PlatformImpl implements INdLogin99PlatformOperate{
    /** TAG */
    private static final String TAG = NdLogin99PlatformImpl.class.getSimpleName();
    
    private Context mContext;
    private NdLogin99Assistant mLogin99Assistant;
    private UserInfo mUser;
    private boolean mbTicketFirst = false;
    private ILogin99Listener mLogin99Listener;
    
    /**处理时的等待对话框*/
    private Dialog mWaitDlg;
    
    /**
     * 构造方法
     * Creates a new instance of NdLogin99PlatformImpl.
     * <br>Created 2014-9-22 下午9:13:48
     * @param context   上下文
     * @param bInit     是否要初始化
     */
    public NdLogin99PlatformImpl(Context context){
        mLogin99Assistant = new NdLogin99Assistant(context);
        mContext = context.getApplicationContext();
        if (mLogin99Assistant.isInitSuccessful() || mLogin99Assistant.isInitializing()) {
            return;
        }
    }
    
    @Override
    public void setLogin99WaitDlg(Dialog waitDlg) {
        mWaitDlg = waitDlg;
    }
    
    @Override
    public void setLogin99Listener(ILogin99Listener listener) {
        mLogin99Listener = listener;
    }
    
    @Override
    public void doInit99Platform() {
        new Thread(new Runnable() {
            public void run() {
                mLogin99Assistant.doInit();
            }
        }).start();
    }

    /**
     * @n<b>函数名称</b> :doLogin
     * @brief 使用帐号+密码登录
     * @see
     * @param @param user 用户信息
     * @param @param password　当前用户输入的密码：当这个值为空(null或者"")的时候，系统会认为这个用户是已经成功
     *        登录过，会使用该用户的getUsername和getUserPassMixedMd5为帐号密码登录91帐号中心
     * @param @param checkcode 验证码
     * @param @param ticketFirst是否优先使用票据登录
     * @param @return
     * @return int
     * @<b>作者</b> : cb
     * @<b>创建时间</b> : 2013-5-27下午2:36:33
     */
    public int doLogin(Context context, UserInfo user, String password, String checkcode,
            boolean ticketFirst) {
        if (ComfunHelp.isNetworkAvailable(mContext)) {
            mUser = user;
            if (mUser == null
                    || TextUtils.isEmpty(mUser.getUserName())
                    || (!ticketFirst && TextUtils.isEmpty(password) &&
                        TextUtils.isEmpty(mUser.getUserPassMixedMd5()))) {
                return R.string.nd_empty_account;
            }
            boolean passwrodManualInput = !TextUtils.isEmpty(password);
            if (passwrodManualInput) {
                // 密码是手动输入的,需要重新加密密码
                mUser.setUserPass(NdLoginComFun.RSAEncrypt(password, NdLoginConst.MODULUS,
                        NdLoginConst.PUBEXP));
                mUser.setUserPassMd5(NdLoginComFun.Md5Digest(password));
                mUser.setUserPassMixedMd5(EncryptTool.getMD5str(password, EncryptTool.TYPE_PSW)
                        .toLowerCase());
            }
            // 判断是否票据优先
            mbTicketFirst = ticketFirst && !passwrodManualInput;
            new LoginNormalLoginTask(context, mLogin99Assistant, mLogin99Listener, mUser,
                    checkcode, mbTicketFirst, mWaitDlg).execute();
            return 0;
        } else {
            return R.string.nd_network;
        }
    }
    
    @Override
    public int doRefreshCheckCode(Context context) {
        if (ComfunHelp.isNetworkAvailable(mContext)) {
            new ProgressGetCheckcode(context, R.string.nd_resending).execute();
            return 0;
        } else {
            return R.string.nd_network;
        }
    }

    /**
     * 处理短信验证码登录时的验证码发送
     * 
     * <br>Created 2014-9-4 下午8:47:35
     * @param context       上下文
     * @param strMobile     手机号
     * @param strCheckCode  验证码
     * @author       linsj
     */
    public void doSendMsgLoginCode(Context context, String strMobile, String strCheckCode) {
        new LoginSendMsgCodeTask(context, mLogin99Assistant, strMobile, strCheckCode,
                mWaitDlg).execute();
    }    

    @Override
    public void doMsgLogin(Context context, String strMobile, String strMsgCheckCode) {
        new LoginMsgLoginTask(context, mLogin99Assistant, mLogin99Listener,
                NdLoginConst.LOGIN_TYPE_UAP, strMobile, EncryptTool.getMD5str(strMsgCheckCode,
                        EncryptTool.TYPE_PSW).toLowerCase(), mWaitDlg).execute();
    }

    private class ProgressGetCheckcode extends ProgressTask {
        public ProgressGetCheckcode(Context context, int resId) {
            super(context, resId);
            
            if(null != mWaitDlg){
                progressDialogIteration = new IProgressDialogIteration() {
                    @Override
                    public void onShow() {
                        mWaitDlg.show();
                    }

                    @Override
                    public void onDismiss() {
                        mWaitDlg.dismiss();
                    }
                };
            }
        }

        @Override
        protected void doSuccess() {
            // 显示验证码（在NdMiscCallbackListener.onGetCheckcodeFinish)里实现
        }

        @Override
        protected Integer doInBackground(Void... params) {
            int code = mLogin99Assistant.doGetCheckcode();
            if (mLogin99Assistant.isNeedInit()) {
                Log.d("debug", "login code=" + code);
                code = mLogin99Assistant.doInit();
                if (code != 0) {
                    return code;
                }
                return mLogin99Assistant.doGetCheckcode();
            }
            return code;
        }

        @Override
        protected void doFail(int result) {
            String errmsg = mLogin99Assistant.getErrmsg();
            NdMiscCallbackListener.onGetCheckcodeFinish(false, result, errmsg, null);
        }
    }
    
    /**
     * 取帐号状态接口
     * 
     * <br>Created 2014-10-23 下午2:00:17
     * @param context   上下文
     * @param account   帐号名
     * @return
     * @author       张清荣
     */
    public IAccountStatus doGetAccountStatus(Context context, String account) {
        StringBuilder receive = new StringBuilder();
        //调用http接口
        int ireturn = uapCom.getInstance(context).getAccountStatus(account, receive);
        
        IAccountStatus bean = new AccountStatus();
        bean.setErrCode(ireturn);
        try {
            if (0 == ireturn) {//操作成功
                //解析
                JSONObject result = new JSONObject(receive.toString());
                
                bean.setmAccountStatus(result.optInt("account_status"));
            } else {//操作失败
                bean.setErrMsg(receive.toString());
            }
        } catch(Exception e) {//解析出错
            e.printStackTrace();
            LogUtil.e(TAG, e.getMessage());
            
            bean.setErrMsg(receive.append(context.getString(R.string.nd_json_error)).toString());
        }
        
        return bean;
    }
}
